
//// 进程程序替换部分 


// 程序替换初步见一见
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>

// 演示进程程序替换的效果
//int main()
//{
//	pid_t id = fork();
//	if(id == 0)
//	{
//		// child
//		printf("我是子进程 , 我要开始执行程序替换了 !\n");
//		execl("/usr/bin/ls" , "ls" , "-al" ,NULL); // 这个系列函数必须以 NULL 结尾
//		printf("我是子进程 , 程序替换执行完毕了 !\n");
//	}	
//	// father
//	pid_t rid = waitpid(id , NULL , 0);
//	if(rid > 0)
//	{
//		printf("Success ! , rid : %d\n" , rid);
//	}
//	else
//	{
//		printf("Failed ! ,%d : %s\n" , errno , strerror(errno));
//	}
//	return 0;
//}




//// execlp
//int main()
//{	
//	printf("我要开始执行 ,execlp 了 \n");
//	//execlp("ls" , "ls" , "-a" , "-l" , NULL);	
//	execlp("ls" , "ls" , "-al" , NULL);	
//	printf("我执行完毕了 !! \n");
//	printf("Success !\n");
//	
//	return 0;
//}



/////////// execv , v - vector

//int main()
//{
//	
//	printf("我要开始执行 ,execv 了 \n");
// 	char* argv[] = {"/usr/bin/ls" ,"-a" , "-l" ,  NULL};
//	execv("/usr/bin/ls" , argv);		
//	
//	printf("执行完毕 ,execv 了 \n");
//	return 0;
//}



//////// execvp , v - vercot , p - PATH , 指不用带路径了 
//int main()
//{
//	
//	printf("我要开始执行 ,execvp 了 \n");
// 	char* argv[] = {"ls" ,"-a" , "-l" ,  NULL};
//	execvp("ls" , argv);		
//	
//	printf("执行完毕 ,execv 了 \n");
//	return 0;
//}


/////// execvpe


//int main()
//{
//	
//	printf("我要开始执行 ,execv 了 \n");
//	// 都以 NULL 结尾 
// 	char* argv[] = {"/usr/bin/ls" ,"-a" , "-l" ,  NULL};
//	char* evn[] = {(char* const)"MYPATH=121313" , NULL};
//	execvpe("ls" , argv, evn);		
//	
//	printf("执行完毕 ,execv 了 \n");
//	return 0;
//}
//



//////////////// putenv

//#include <stdlib.h>
//// 要增加的环境变量表           
//char *const addenv[] = {
//    (char *const)"MYVAL=123456789",
//    (char *const)"MYVAL1=123456789",
//    (char *const)"MYVAL2=123456789",
//    NULL
//};
//
//
//int main(int argc , char* argv[] , char* env[])
//{	
//	// 遍历 addenv 一个一个增加
//	for(int i = 0; i ; i++)
//	{
//		putenv(addenv[i]); // 默认就添加在系统中的全局变量 environ 中
//	}
//	
////	for(int i = 0 ; env[i]; i++)
////	{
////		printf("env[%d] -> %s\n",i,env[i]);
////	}	
//	
//	return 0;
//}








/////////////////////////////////  最终写法  , 子进程去替换

int main()
{
	printf("程序要运行了!\n");
	pid_t id = fork();
	if(id == 0)
	{
		//child
		printf("I am Child, My Pid Is: %d\n", getpid());
       		sleep(1);		

		char* argv[] = {"ls" , "-l" , "-a" , NULL};
		execvp("ls" , argv);
	
	}
	// father
	 waitpid(-1, NULL, 0);
   	 printf("我的程序运行完毕了\n");
	

}




